///import core
///commands 右键菜单
///commandsName  ContextMenu
///commandsTitle  右键菜单
/**
 * 右键菜单
 * @function
 * @name baidu.editor.plugins.contextmenu
 * @author zhanyi
 */

UE.plugins["contextmenu"] = function () {
    var me = this;
    me.setOpt("enableContextMenu", true);
    if (me.getOpt("enableContextMenu") === false) {
        return;
    }
    var lang = me.getLang("contextMenu"),
        menu,
        items = me.options.contextMenu || [
            { label: lang["selectall"], cmdName: "selectall" },
            {
                label: lang.cleardoc,
                cmdName: "cleardoc",
                exec: function () {
                    if (confirm(lang.confirmclear)) {
                        this.execCommand("cleardoc");
                    }
                },
            },
            "-",
            {
                label: lang.unlink,
                cmdName: "unlink",
            },
            "-",
            {
                group: lang.paragraph,
                icon: "justifyjustify",
                subMenu: [
                    {
                        label: lang.justifyleft,
                        cmdName: "justify",
                        value: "left",
                    },
                    {
                        label: lang.justifyright,
                        cmdName: "justify",
                        value: "right",
                    },
                    {
                        label: lang.justifycenter,
                        cmdName: "justify",
                        value: "center",
                    },
                    {
                        label: lang.justifyjustify,
                        cmdName: "justify",
                        value: "justify",
                    },
                ],
            },
            "-",
            {
                group: lang.table,
                icon: "table",
                subMenu: [
                    {
                        label: lang.inserttable,
                        cmdName: "inserttable",
                    },
                    {
                        label: lang.deletetable,
                        cmdName: "deletetable",
                    },
                    "-",
                    {
                        label: lang.deleterow,
                        cmdName: "deleterow",
                    },
                    {
                        label: lang.deletecol,
                        cmdName: "deletecol",
                    },
                    {
                        label: lang.insertcol,
                        cmdName: "insertcol",
                    },
                    {
                        label: lang.insertcolnext,
                        cmdName: "insertcolnext",
                    },
                    {
                        label: lang.insertrow,
                        cmdName: "insertrow",
                    },
                    {
                        label: lang.insertrownext,
                        cmdName: "insertrownext",
                    },
                    "-",
                    {
                        label: lang.insertcaption,
                        cmdName: "insertcaption",
                    },
                    {
                        label: lang.deletecaption,
                        cmdName: "deletecaption",
                    },
                    {
                        label: lang.inserttitle,
                        cmdName: "inserttitle",
                    },
                    {
                        label: lang.deletetitle,
                        cmdName: "deletetitle",
                    },
                    {
                        label: lang.inserttitlecol,
                        cmdName: "inserttitlecol",
                    },
                    {
                        label: lang.deletetitlecol,
                        cmdName: "deletetitlecol",
                    },
                    "-",
                    {
                        label: lang.mergecells,
                        cmdName: "mergecells",
                    },
                    {
                        label: lang.mergeright,
                        cmdName: "mergeright",
                    },
                    {
                        label: lang.mergedown,
                        cmdName: "mergedown",
                    },
                    "-",
                    {
                        label: lang.splittorows,
                        cmdName: "splittorows",
                    },
                    {
                        label: lang.splittocols,
                        cmdName: "splittocols",
                    },
                    {
                        label: lang.splittocells,
                        cmdName: "splittocells",
                    },
                    "-",
                    {
                        label: lang.averageDiseRow,
                        cmdName: "averagedistributerow",
                    },
                    {
                        label: lang.averageDisCol,
                        cmdName: "averagedistributecol",
                    },
                    "-",
                    {
                        label: lang.edittd,
                        cmdName: "edittd",
                        exec: function () {
                            if (UE.ui["edittd"]) {
                                new UE.ui["edittd"](this);
                            }
                            this.getDialog("edittd").open();
                        },
                    },
                    {
                        label: lang.edittable,
                        cmdName: "edittable",
                        exec: function () {
                            if (UE.ui["edittable"]) {
                                new UE.ui["edittable"](this);
                            }
                            this.getDialog("edittable").open();
                        },
                    },
                    {
                        label: lang.setbordervisible,
                        cmdName: "setbordervisible",
                    },
                ],
            },
            {
                group: lang.tablesort,
                icon: "tablesort",
                subMenu: [
                    {
                        label: lang.enablesort,
                        cmdName: "enablesort",
                    },
                    {
                        label: lang.disablesort,
                        cmdName: "disablesort",
                    },
                    "-",
                    {
                        label: lang.reversecurrent,
                        cmdName: "sorttable",
                        value: "reversecurrent",
                    },
                    {
                        label: lang.orderbyasc,
                        cmdName: "sorttable",
                        value: "orderbyasc",
                    },
                    {
                        label: lang.reversebyasc,
                        cmdName: "sorttable",
                        value: "reversebyasc",
                    },
                    {
                        label: lang.orderbynum,
                        cmdName: "sorttable",
                        value: "orderbynum",
                    },
                    {
                        label: lang.reversebynum,
                        cmdName: "sorttable",
                        value: "reversebynum",
                    },
                ],
            },
            {
                group: lang.borderbk,
                icon: "borderBack",
                subMenu: [
                    {
                        label: lang.setcolor,
                        cmdName: "interlacetable",
                        exec: function () {
                            this.execCommand("interlacetable");
                        },
                    },
                    {
                        label: lang.unsetcolor,
                        cmdName: "uninterlacetable",
                        exec: function () {
                            this.execCommand("uninterlacetable");
                        },
                    },
                    {
                        label: lang.setbackground,
                        cmdName: "settablebackground",
                        exec: function () {
                            this.execCommand("settablebackground", {
                                repeat: true,
                                colorList: ["#bbb", "#ccc"],
                            });
                        },
                    },
                    {
                        label: lang.unsetbackground,
                        cmdName: "cleartablebackground",
                        exec: function () {
                            this.execCommand("cleartablebackground");
                        },
                    },
                    {
                        label: lang.redandblue,
                        cmdName: "settablebackground",
                        exec: function () {
                            this.execCommand("settablebackground", {
                                repeat: true,
                                colorList: ["red", "blue"],
                            });
                        },
                    },
                    {
                        label: lang.threecolorgradient,
                        cmdName: "settablebackground",
                        exec: function () {
                            this.execCommand("settablebackground", {
                                repeat: true,
                                colorList: ["#aaa", "#bbb", "#ccc"],
                            });
                        },
                    },
                ],
            },
            {
                group: lang.aligntd,
                icon: "aligntd",
                subMenu: [
                    {
                        cmdName: "cellalignment",
                        value: { align: "left", vAlign: "top" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "center", vAlign: "top" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "right", vAlign: "top" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "left", vAlign: "middle" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "center", vAlign: "middle" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "right", vAlign: "middle" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "left", vAlign: "bottom" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "center", vAlign: "bottom" },
                    },
                    {
                        cmdName: "cellalignment",
                        value: { align: "right", vAlign: "bottom" },
                    },
                ],
            },
            {
                group: lang.aligntable,
                icon: "aligntable",
                subMenu: [
                    {
                        cmdName: "tablealignment",
                        className: "left",
                        label: lang.tableleft,
                        value: "left",
                    },
                    {
                        cmdName: "tablealignment",
                        className: "center",
                        label: lang.tablecenter,
                        value: "center",
                    },
                    {
                        cmdName: "tablealignment",
                        className: "right",
                        label: lang.tableright,
                        value: "right",
                    },
                ],
            },
            "-",
            {
                label: lang.insertparagraphbefore,
                cmdName: "insertparagraph",
                value: true,
            },
            {
                label: lang.insertparagraphafter,
                cmdName: "insertparagraph",
            },
            {
                label: lang["copy"],
                cmdName: "copy",
            },
            {
                label: lang["paste"],
                cmdName: "paste",
            },
        ];
    if (!items.length) {
        return;
    }
    var uiUtils = UE.ui.uiUtils;

    me.addListener("contextmenu", function (type, evt) {
        var offset = uiUtils.getViewportOffsetByEvent(evt);
        me.fireEvent("beforeselectionchange");
        if (menu) {
            menu.destroy();
        }
        for (var i = 0, ti, contextItems = []; (ti = items[i]); i++) {
            var last;
            (function (item) {
                if (item == "-") {
                    if (
                        (last = contextItems[contextItems.length - 1]) &&
                        last !== "-"
                    ) {
                        contextItems.push("-");
                    }
                } else if (item.hasOwnProperty("group")) {
                    for (
                        var j = 0, cj, subMenu = [];
                        (cj = item.subMenu[j]);
                        j++
                    ) {
                        (function (subItem) {
                            if (subItem == "-") {
                                if (
                                    (last = subMenu[subMenu.length - 1]) &&
                                    last !== "-"
                                ) {
                                    subMenu.push("-");
                                } else {
                                    subMenu.splice(subMenu.length - 1);
                                }
                            } else {
                                if (
                                    (me.commands[subItem.cmdName] ||
                                        UE.commands[subItem.cmdName] ||
                                        subItem.query) &&
                                    (subItem.query
                                        ? subItem.query()
                                        : me.queryCommandState(
                                              subItem.cmdName
                                          )) > -1
                                ) {
                                    subMenu.push({
                                        label:
                                            subItem.label ||
                                            me.getLang(
                                                "contextMenu." +
                                                    subItem.cmdName +
                                                    (subItem.value || "")
                                            ) ||
                                            "",
                                        className:
                                            "edui-for-" +
                                            subItem.cmdName +
                                            (subItem.className
                                                ? " edui-for-" +
                                                  subItem.cmdName +
                                                  "-" +
                                                  subItem.className
                                                : ""),
                                        onclick: subItem.exec
                                            ? function () {
                                                  subItem.exec.call(me);
                                              }
                                            : function () {
                                                  me.execCommand(
                                                      subItem.cmdName,
                                                      subItem.value
                                                  );
                                              },
                                    });
                                }
                            }
                        })(cj);
                    }
                    if (subMenu.length) {
                        function getLabel() {
                            switch (item.icon) {
                                case "table":
                                    return me.getLang("contextMenu.table");
                                case "justifyjustify":
                                    return me.getLang("contextMenu.paragraph");
                                case "aligntd":
                                    return me.getLang("contextMenu.aligntd");
                                case "aligntable":
                                    return me.getLang("contextMenu.aligntable");
                                case "tablesort":
                                    return lang.tablesort;
                                case "borderBack":
                                    return lang.borderbk;
                                default:
                                    return "";
                            }
                        }
                        contextItems.push({
                            //todo 修正成自动获取方式
                            label: getLabel(),
                            className: "edui-for-" + item.icon,
                            subMenu: {
                                items: subMenu,
                                editor: me,
                            },
                        });
                    }
                } else {
                    //有可能commmand没有加载右键不能出来，或者没有command也想能展示出来添加query方法
                    if (
                        (me.commands[item.cmdName] ||
                            UE.commands[item.cmdName] ||
                            item.query) &&
                        (item.query
                            ? item.query.call(me)
                            : me.queryCommandState(item.cmdName)) > -1
                    ) {
                        contextItems.push({
                            label:
                                item.label ||
                                me.getLang("contextMenu." + item.cmdName),
                            className:
                                "edui-for-" +
                                (item.icon
                                    ? item.icon
                                    : item.cmdName + (item.value || "")),
                            onclick: item.exec
                                ? function () {
                                      item.exec.call(me);
                                  }
                                : function () {
                                      me.execCommand(item.cmdName, item.value);
                                  },
                        });
                    }
                }
            })(ti);
        }
        if (contextItems[contextItems.length - 1] == "-") {
            contextItems.pop();
        }

        menu = new UE.ui.Menu({
            items: contextItems,
            className: "edui-contextmenu",
            editor: me,
        });
        menu.render();
        menu.showAt(offset);

        me.fireEvent("aftershowcontextmenu", menu);

        domUtils.preventDefault(evt);
        if (browser.ie) {
            var ieRange;
            try {
                ieRange = me.selection.getNative().createRange();
            } catch (e) {
                return;
            }
            if (ieRange.item) {
                var range = new dom.Range(me.document);
                range.selectNode(ieRange.item(0)).select(true, true);
            }
        }
    });

    // 添加复制的flash按钮
    me.addListener("aftershowcontextmenu", function (type, menu) {
        if (me.zeroclipboard) {
            var items = menu.items;
            for (var key in items) {
                if (items[key].className == "edui-for-copy") {
                    me.zeroclipboard.clip(items[key].getDom());
                }
            }
        }
    });
};
